package com.xiaozhaovip.demo.controller.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 使用阿里云OSS存储对象上传图片
 *
 * @author Cauli
 */
@Slf4j
@Component
public class AliyunOSSClientUtils {
    @Value("${aliyun.oss.endpoint}")
    private String ENDPOINT;

    @Value("${aliyun.oss.accessKeyId}")
    private String ACCESSKEYID;

    @Value("${aliyun.oss.secret}")
    private String SECRET;

    @Value("${aliyun.oss.bucket}")
    private String BUCKET;

    /**
     * 上传多个文件
     *
     * @param files
     */
    public List<Map<String, Object>> filesUpload(MultipartFile[] files) {
        List<Map<String, Object>> fileList = new ArrayList<>();
        // 判断file数组不能为空并且长度大于0
        if (files != null && files.length > 0) {
            // 循环获取file数组中得文件
            for (MultipartFile file : files) {
                // 保存文件
                Map<String, Object> fileInfoMap = saveFile(file);
                // 返回文件信息
                fileList.add(fileInfoMap);
            }
        }
        return fileList;
    }

    /**
     * 上传文件到阿里云oss
     *
     * @param file
     * @return
     */
    public Map<String, Object> saveFile(MultipartFile file) {
        // 填写Endpoint地区
        String endpoint = ENDPOINT;
        // 使用RAM用户进行API访问或日常运维
        String accessKeyId = ACCESSKEYID;
        String accessKeySecret = SECRET;
        // 填写Bucket名称
        String bucketName = BUCKET;

        // 创建OSSClient实例
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
            InputStream inputStream = file.getInputStream();
            // 文件大小（单位：KB）
            long size = file.getSize() / 1024;
            // 文件名称
            String originalFilename = file.getOriginalFilename();
            // 文件类型
            String type = null;
            if (originalFilename != null) {
                type = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();
            }

            //生成随机唯一值，使用uuid替代文件名称，避免图片名字违规
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            String filename = uuid + "." + type;
            // 按照当前日期，创建文件夹，上传到创建文件夹里面
            String dateUrl = new SimpleDateFormat("yyyy/MM").format(new Date());
            // 重构文件路径，例如：2022/08/picture.jpg
            String filePath = dateUrl + "/" + filename;

            // 创建PutObject请求。
            ossClient.putObject(bucketName, filePath, inputStream);

            // 上传之后返回文件路径，例如：https://yueqilai.oss-cn-shenzhen.aliyuncs.com/2022/08/picture.jpg
            String url = "https://" + bucketName + "." + endpoint + "/" + filePath;

            // 返回处理
            Map<String, Object> fileInfoMap = new HashMap<>(4);
            fileInfoMap.put("originalFilename", originalFilename);
            fileInfoMap.put("filename", filename);
            fileInfoMap.put("filePath", filePath);
            fileInfoMap.put("url", url);
            fileInfoMap.put("size", size);

            return fileInfoMap;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            //关闭ossClient
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}


